#ifndef AUTOUPDATE_H
#define AUTOUPDATE_H

#include <QObject>
#include <QNetworkAccessManager>
#include <QVersionNumber>
#include <QScopedPointer>

class QNetworkReply;
class QProgressDialog;
class QTimer;

class AutoUpdateService : public QObject
{
    Q_OBJECT

public:
    explicit AutoUpdateService(QObject *parent = nullptr);
    ~AutoUpdateService();

    // 设置应用程序信息
    void setApplicationInfo(const QString &name, const QString &version);
    
    // 设置更新服务器URL
    void setUpdateServerUrl(const QString &url);
    
    // 设置更新检查间隔（小时）
    void setCheckInterval(int hours);
    
    // 手动检查更新
    void checkForUpdates();
    
    // 自动检查更新
    void setAutoCheck(bool autoCheck);
    bool isAutoCheck() const;

signals:
    void updateAvailable(const QString &version, const QString &changelog);
    void noUpdateAvailable();
    void updateCheckError(const QString &error);
    void updateDownloaded(const QString &filePath);
    void updateDownloadError(const QString &error);

public slots:
    void downloadUpdate(const QString &downloadUrl);
    void installUpdate(const QString &installerPath);

private slots:
    void onCheckUpdateFinished();
    void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
    void onDownloadFinished();
    void onCheckTimerTimeout();

private:
    void startUpdateCheck();
    void parseUpdateInfo(const QByteArray &data);
    bool isVersionNewer(const QString &version) const;
    
    QNetworkAccessManager *networkManager;
    QString applicationName;
    QVersionNumber currentVersion;
    QString updateServerUrl;
    bool autoCheck;
    int checkInterval; // 小时
    
    QNetworkReply *checkReply;
    QNetworkReply *downloadReply;
    
    QTimer *checkTimer;
    QProgressDialog *downloadDialog;
    
    QString latestVersion;
    QString downloadUrl;
};

#endif // AUTOUPDATE_H